<?php
/** 
 * servicio para la administración de clientes.
 * @author gemu
 * 
 * 
 */
class ClienteService
{
	/**
	 * Da de alta un cliente.
	 * @param Cliente $cliente
	 */
	public function altaCliente($cliente) {
		Validator::rechazarNoLogeado();
		Validator::validarNoVacio($cliente, 'cliente');
		Validator::validarNoVacio($cliente->juridica, 'juridica');
		Validator::validarNoVacio($cliente->rut, 'rut');
		Validator::validarNoVacio($cliente->razonsocial, 'razonsocial');
		Validator::validarNumero($cliente->codCiudad, 1, null, 'codCiudad');
		
		$query = "INSERT INTO cliente(juridica,rut,razonsocial,giro,direccion,fono_fijo,fono_movil,correo_electronico,"
				."per_contacto,ciudad_id,apaterno,amaterno,fecha_nac,cod_est_civil,gesdoc_directorio_id) "
			."VALUES(".($cliente->juridica ? 'true' : 'false').",'".$cliente->razonsocial."','".$cliente->giro."','".$cliente->direccion."'".
			"'".$cliente->fonoFijo."','".$cliente->fonoMovil."','".$cliente->correoElectronico."','".$cliente->perContacto."',".$cliente->codCiudad.
			",'".$cliente->apaterno."','".$cliente->amaterno."','".$cliente->fecha."',".$cliente->codEstadoCivil.",".$cliente->codGesDoc.")";
		try {
			Database::operacion($query);
		} catch (FatalException $e) {
			if($e->srcCode == 1062) {
				throw new ServiceException('error.registro_ya_existe');
			}
		}
	}
	
	/**
	 * Busca clientes aplicando filtros.
	 * @param Cliente $cliente
	 * @param Paginador $paginador
	 * @return ListaPaginada
	 */
	public function buscarCliente($cliente, $paginador) {
		Validator::rechazarNoLogeado();
        $lista = array();
        $filtro = $this->crearCadenaFiltro($cliente);
		
		$query = "SELECT * FROM cliente".$filtro;
		$result = Database::consulta($query, $paginador);
		while ($row = Database::obtenerFila($result)) {
			$cliente = new Cliente();
			$cliente->id = $row['id'];
			$cliente->juridica = $row['juridica'];
			$cliente->rut = $row['rut'];
			$cliente->razonsocial = $row['razonsocial'];
			$cliente->giro = $row['giro'];
			$cliente->direccion = $row['direccion'];
			$cliente->fonoFijo = $row['fono_fijo'];
			$cliente->fonoMovil = $row['fono_movil'];
			$cliente->correoElectronico = $row['correo_electronico'];
			$cliente->perContacto = $row['per_contacto'];
			$cliente->codCiudad = $row['ciudad_id'];
			$cliente->apaterno = $row['apaterno'];
			$cliente->amaterno = $row['amaterno'];
			$cliente->fecha = $row['fecha'];
			$cliente->codEstadoCivil = $row['cod_est_civil'];
			$lista[] = $cliente;
		}
		
		$listaPaginada = new ListaPaginada();
		$listaPaginada->lista = $lista;
		$listaPaginada->paginador = $paginador;
		return $listaPaginada;
	}
	
	

	/**
	 * Crea una cadena de filtro selectivo para usuario.
	 * @param Cliente $entidad
	 */
	private function crearCadenaFiltro($entidad) {
		$filtro = '';
        
        if ($entidad != null) {
        	if($entidad->id != null && is_numeric($entidad->id)) {
				$filtro .= "id = ".intval($usuario->id)." AND ";
			}
			if($entidad->juridica != "") {
				$filtro .= "UPPER(juridica) like '".strtoupper($entidad->juridica)."%' AND ";
			}
			if($entidad->rut != "") {
				$filtro .= "UPPER(rut) like '".strtoupper($entidad->rut)."%' AND ";
			}
			if($entidad->razonsocial != "") {
				$filtro .= "UPPER(razonsocial) like '".strtoupper($entidad->razonsocial)."%' AND ";
			}
			if($entidad->giro != "") {
				$filtro .= "UPPER(giro) like '".strtoupper($entidad->giro)."%' AND ";
			}
			if($entidad->direccion != "") {
				$filtro .= "UPPER(direccion) like '".strtoupper($entidad->direccion)."%' AND ";
			}
			if($entidad->fonoFijo != "") {
				$filtro .= "UPPER(fono_fijo) like '".strtoupper($entidad->fonoFijo)."%' AND ";
			}
			if($entidad->fonoMovil != "") {
				$filtro .= "UPPER(fono_movil) like '".strtoupper($entidad->fonoMovil)."%' AND ";
			}
			if($entidad->correoElectronico != "") {
				$filtro .= "UPPER(correo_electronico) like '".strtoupper($entidad->correoElectronico)."%' AND ";
			}
			if($entidad->perContacto != "") {
				$filtro .= "UPPER(per_contacto) like '".strtoupper($entidad->perContacto)."%' AND ";
			}
			if($entidad->codCiudad != null && is_numeric($entidad->codCiudad)) {
				$filtro .= "ciudad_id = ".intval($entidad->codCiudad)." AND ";
			}
			if($entidad->apaterno != "") {
				$filtro .= "UPPER(apaterno) like '".strtoupper($entidad->apaterno)."%' AND ";
			}
			if($entidad->amaterno != "") {
				$filtro .= "UPPER(amaterno) like '".strtoupper($entidad->amaterno)."%' AND ";
			}
			if($entidad->fecha != "") {
				$filtro .= "UPPER(fecha) like '".strtoupper($entidad->fecha)."%' AND ";
			}
			if ($entidad->codEstadoCivil != null && is_numeric($entidad->codEstadoCivil)) {
				$filtro .= "cod_est_civil = ".intval($entidad->codEstadoCivil)." AND ";
			}
            if ($filtro != "") {
                $filtro = " WHERE ".substr($filtro, 0, -5);	
			}
		}
		
		return $filtro;
	}
	
	/**
	 * Actualiza los datos del cliente.
	 * @param Cliente $cliente
	 */
	public function actualizarUsuario($cliente) {
		Validator::rechazarNoLogeado();
		Validator::validarNoVacio($cliente, 'cliente');
		Validator::validarNoVacio($cliente->id, 'id');
		Validator::validarNoVacio($cliente->juridica, 'juridica');
		Validator::validarNoVacio($cliente->rut, 'rut');
		Validator::validarNoVacio($cliente->razonsocial, 'razonsocial');
		Validator::validarNoVacio($cliente->codCiudad, 'codCiudad');
		
		if($this->isValidoId($cliente->id)) {
			
			$query = "UPDATE usuario SET "
			."juridica='".($cliente->juridica ? 'true' : 'false')."', "
			."rut='".$cliente->rut."', "
			."razonsocial='".$cliente->razonsocial."', "
			."giro='".$cliente->giro."', "
			."direccion='".$cliente->direccion."', "
			."fono_fijo='".$cliente->fonoFijo."', "
			."fono_movil='".$cliente->fonoMovil."', "
			."correo_electronico='".$cliente->correoElectronico."', "
			."per_contacto='".$cliente->perContacto."', "
			."ciudad_id='".intval($cliente->codCiudad)."', "
			."apaterno='".$cliente->apaterno."', "
			."amaterno='".$cliente->amaterno."', "
			."fecha_nac='".$cliente->fecha."', "
			."cod_est_civil='".$cliente->codEstadoCivil."' "
			."WHERE id=".$cliente->id;
			
			Database::operacion($query);	
		} else {
			throw new ServiceException('error.validacion.usuario_no_existe');
		}
	}
}
?>